package metier.math;

import librairies.liste.interfaces.IListe;

/**
 * creation des operations.
 * 
 * @author mlozach
 */
public class Operation
{
	/**
	 * permet de faire des additionss
	 * @param list liste de nombre
	 * @return le resultat de calcul
	 */
	public static Double addition(IListe<Number> list)
	{
		Double result;
		
		if(list == null || list.size() == 0)
		{
			return null;
		}
		
		if(list.size() == 1)
		{
			return list.get(0).doubleValue();
		}
		
		result = list.get(0).doubleValue();
		
		for(int i = 1; i < list.size(); ++i)
		{
			if(list.get(i) != null)
			{
				result = result + list.get(i).doubleValue();
			}
		}
		
		return result;
	}
	
	/**
	 * permet de faire des soustractions
	 * @param list liste de nombre
	 * @return le resultat de calcul
	 */
	public static Double soustraction(IListe<Number> list)
	{
		Double result;
		
		if(list == null || list.size() == 0)
		{
			return null;
		}
		
		if(list.size() == 1)
		{
			return list.get(0).doubleValue();
		}
		
		result = list.get(0).doubleValue();
		
		for(int i = 1; i < list.size(); ++i)
		{
			if(list.get(i) != null)
			{
				result = result - list.get(i).doubleValue();
			}
		}
		
		return result;
	}
	
	/**
	 * permet de faire des multiplication
	 * @param list liste de nombre
	 * @return le resultat de calcul
	 */
	public static Double multiplication(IListe<Number> list)
	{
		Double result;
		
		if(list == null || list.size() == 0)
		{
			return null;
		}
		
		if(list.size() == 1)
		{
			return list.get(0).doubleValue();
		}
		
		result = list.get(0).doubleValue();
		
		for(int i = 1; i < list.size(); ++i)
		{
			if(list.get(i) != null)
			{
				result = result * list.get(i).doubleValue();
			}
		}
		
		return result;
	}
	
	/**
	 * permet de faire des division
	 * @param list liste de nombre
	 * @return le resultat de calcul
	 */
	public static Double division(IListe<Number> list)
	{
		Double result;
		
		if(list == null || list.size() == 0)
		{
			return null;
		}
		else if(list.size() == 1)
		{
			return list.get(0).doubleValue();
		}
		else 
		{
			for(int i = 1; i < list.size(); ++i)
			{
				if(list.get(i) != null && list.get(i).equals(0))
				{
					throw new ArithmeticException("Division par zero");
				}
			}
		}

		result = list.get(0).doubleValue();
		
		for(int i = 1; i < list.size(); ++i)
		{
			if(list.get(i) != null)
			{
				result = result / list.get(i).doubleValue();
			}
		}
		
		return result;
	}
}